perm filename HALIO.PAL[HAL,HE]14 blob sn#252556 filedate 1976-12-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	.SBTTL	Basic TTY input and output routines
C00003 00003	 TTY output routines  TYPSTR, TYPDEC, TYPOCT, TYPCHR
C00008 00004	 Macros:  OUTSTR, NUMOUT, ASCIE, CRLF, HALERR, ERRTRAP
C00012 00005	 IOINIT, INSTR, system line buffers
C00015 ENDMK
C⊗;
.SBTTL	Basic TTY input and output routines
.EVEN

; TTY output routines  TYPSTR, TYPDEC, TYPOCT, TYPCHR

;  Modified 5-Sep-74 by RF.  Originally written by KKP.

COMMENT ⊗ Output a string, ending with a zero character. Pointer to
start of string in R0.  Called in "simple" style. ⊗

TYPSTR:	MOV R0,R1	;R1 ← LOC[STRING]
	MOVB (R1)+,R0	;R0 ← first byte of string
1$:	BEQ 2$		;If null, exit now.
	JSR PC,TYPCHR	;Type this one character
	MOVB (R1)+,R0	;R0 ← Next byte of string
	BNE 1$		;If more to come, repeat.
2$:	RTS PC		;Done


COMMENT ⊗ Routines to output numbers.  Argument in R0.  TYPDEC
outputs in base 10, and TYPOCT in base 8.  Both use TYPDIG as a
subroutine, putting the digit in R0.  TYPCHR is a general purpose
character output routine.  It looks at OUTSW to see where to direct
the output. ⊗

TYPDEC:	MOV #12,RADIX	;To output in base 10
	BR TYPDIG	;Go type it.
TYPOCT:	MOV #8,RADIX	;To output in base 8.
	BR TYPDIG	;Go type it.
TYPDIG:	MOV R0,R1	;Need dividend in R1, with R0 clear.
	CLR R0		;Clear upper half of dividend.
	DIV (PC)+,R0	;Divide argument in R0, R1 by radix.
RADIX:	12		;Starts out in decimal.
	BEQ TYPOUT	;If quotient zero, then can print.
	MOV R1,-(SP)	;Else stack quotient
 	JSR PC,TYPDIG	;Recursive call.
	MOV (SP)+,R1	;Unstack last quotient
TYPOUT:	ADD #'0,R1	;Form TTY code for digit
	MOV R1,R0	;Need argument for TYPCHR in R0.
TYPCHR:	TST OUTSW	;VT05 or console?
	BEQ 3$		;
	TSTB KBOS	;VT05: Is it available?
	BMI 2$		;Yes.
1$:
    .IFDF KERNEL
    .IFNZ KERNEL
	SLEEP #2	;No.  Sleep a while, try again
    .ENDC
    .ENDC
	BR TYPCHR	;
2$:	MOVB R0,KBOR	;Output a byte to it.
	CMP #12,R0	;Was it a line feed?
	BNE TYPRET	;If not that code, then done.
	CLR R0		;Otherwise, output 3 nulls.
	JSR PC,TYPCHR	;
	JSR PC,TYPCHR	;
	JMP TYPCHR	;Direct jump; it will return to caller.
3$:	TSTB OREG	;Console:  Ready?
	BNE 1$		;No.
	MOVB R0,OREG	;Yes.  Output a byte to it.
	MOV #1,172566	;Wake up pdp10 by generating interrupt
TYPRET:	RTS PC		;Return.
; Macros:  OUTSTR, NUMOUT, ASCIE, CRLF, HALERR, ERRTRAP

       .MACRO OUTSTR B	;Type string starting at B.
	MOV R0,-(SP)	;Save R0.  Who knows what was happening in it?
	MOV R1,-(SP)	;Save R1.
	MOV #B,R0	;Load up the string to be output
	JSR PC,TYPSTR	;Call the string output utility routine.
	MOV (SP)+,R1	;Restore R1.
	MOV (SP)+,R0	;Restore R0.
       .ENDM

       .MACRO NUMOUT	;Type out the number in AC0 with CVG using OUTBUF
	MOV R0,-(SP)	;Save the registers
	MOV R1,-(SP)
	STF AC0,-(SP)
	STF AC1,-(SP)
	MOV #OUTBUF,R0	;Use OUTBUF to construct the string
	JSR PC,CVG	;Convert floating point number to asc
	LDF (SP)+,AC1   ;Restore the floating point registers
	LDF (SP)+,AC0
	MOV #OUTBUF,R0	;Set pointer for i/o routine
	JSR PC,TYPSTR	;Type out the number
	MOV (SP)+,R1	;Restore the registers
	MOV (SP)+,R0
       .ENDM

       .MACRO ASCIE STR
       .ASCIZ STR
       .EVEN
       .ENDM

       .MACRO	CRLF
	OUTSTR CRLFX	;Carriage return, line feed.
       .ENDM

CRLFX: .ASCIZ /
/

RUGMES:	ASCIE </π
--ONLY DDT CAN HELP YOU NOW!
π/>

ERRTRAP:
; Pointer to message is on stack.  Print it, restore state, go to DDT
	MOV R0,-(SP)	;Save R0.
	MOV R1,-(SP)	;Save R1.
    .IFDF KERNEL
    .IFNZ KERNEL
	EVWAIT CSLEVT	;Grab the console
    .ENDC
    .ENDC
	MOV #CRLFX,R0	;Move to new line
	JSR PC,TYPSTR	;
	MOV 6(SP),R0	;Type out message
	JSR PC,TYPSTR	;
	MOV #RUGMES,R0	;Type out RUGMES
	JSR PC,TYPSTR	;
    .IFDF KERNEL
    .IFNZ KERNEL
	EVSIG CSLEVT	;Release the console
    .ENDC
    .ENDC
	MOV (SP)+,R1	;Restore R1.
	MOV (SP)+,R0	;Restore R0.
	MOV (SP)+,(SP)	;put return address only on stack.
	BPT		;Breakpoint to DDT.
	RTS PC		;Return to calling point.

PUTLOC LERRTRAP, ERRTRAP
; IOINIT, INSTR, system line buffers

CSLEVT:	0		;Console interlock event
IOINIT:
    .IFDF KERNEL
    .IFNZ KERNEL
	EV↓≠β⊗$∩v~∀%≠∨,@!' RY
'→-P∩v~∀%-'∪≤∩∩w≠¬WJAB↓G←]g=YJAS9iKeY=GVAKYK]h~(@@@@9≥	ε4∀@@@]≥	~∀∪%Q&A!ε$∩v~∀4∃π∨≠5≥(@XA'ie%]NAEeiJAa=S]iKHACeOU[K]h↓S\A$@\@Aα↓GCee%COJAIKike8ASf~)Cggk5KHAi<AEJAQQJAC
iSmCQS←\A
QCeC
iKd\↓αAek	←khA%fABA⊃KYKi%]N~∃	CGWgACGJA
QCeC
iKd\AβhAQQJAG=[aYKQS←\A=LAiQ%fAe←UiS]J↓BA]k1X~∃G!CeCGQKdASLAaYC
KHACPAiQJ↓K]HA=LAiQ∀AS]aUhAgiIS]N\A$`AQQK\AA←S]iL~∃i↑↓iQJA9kYXA
QCeC
iKd\A%KO%giKeLAkgK⊂tA$`↓aCgg∃fAiQ∀ACeOU[K]h0A$bA%f~∃O¬eECO∃H\@@X~∀~∃%≥')$h∪π→$%ππ≥($∩w%M(Aπ!β%βπQ$Aπ=+≥(~)∪≤dt%)'(@%∨+)'\∩∩w-P`jA∨HAπ∨≥M∨→
}4∀∪¬D@∪π∨9'∪≤∩4∀∪)'Q∧∪↔¬%&∩∩wQ'(A%A↔e¬∨β%⊂A%β⊃2~∀∪	"∪∪8d∩∩w]β∪(AQ∪→_A%(A∪&4∀∪≠∨Y∧∪↔¬%$Y$b$∩w∂PAαAπ!β%βπQ$~∀%¬$∪∂=)πβ$4∃π∨≥M∪≤t∪5∨,∪∪I∞Y$D∩∩w¬e)
A
I∨~A!⊃ b`}4∀∪¬D∪∪≤d$∩w≥≡4∀∪π→H∪∪%≤~∃∂∨Qπβ$t%¬∪ε@@@@FDnnl`@Y$b∩m≠β'⊗↓∨
@4A≠β↔∀A∪(@\A¬∪)L~∀∪π5 ∪$b0Fbnn$∩wπ∨5!β%
↓)≡A¬LAπ⊃βIβπ)H~∀∪¬9
∩bH$∩w'↔% A∪↓∪)&A9∨(~∀%)'(∪
π≥(∩$wπ⊃
⊗A∪↓β≥2A
⊃β%β
)%&↓∪≤A¬U

$4∀∪¬D∪∪≤d$∩w
∨I∂(A	βπ⊗AM!βπ
↓∪A≥<Aπ⊃βH\~∀∪⊃ε@@@A$`@@∩∩m%≠∨Y
A→βM(Aπ⊃¬%βπ)∃$A∪≤↓¬+

∃$~∀∪⊃ε∪π
≥(∩∩m	π%∃≠≥(↓π⊃β%¬π)$↓π∨+≥P~∀∪∨U)')$A	¬&$∩w!I
∨%~↓αA	1)∪≥≤A¬βπ-'!βπ∀~∀∪¬H@@@@A∪≤d4∀bHt%π≠ ∪HbXFbT∩∩wπ=≠!β%∀A)≡A
$Aπ⊃¬%βπ)∃$~∀∪	"@@@@dH@@∩∩mπ∨≥)%≥+
AIβ	∪9∞A∪↓∪)&A9∨(Aα↓π$~∀%π≠ ∪HbXFh@∩∩wπ!π⊗A%Aπ⊃¬%βπ)∃$A→≥β_~∀%¬→(∪%≤d∩∩m∪∂≥∨HA∪A%(A∪&4∀@@@∪≠∨-λ∪$bX!$`RV$w'β-∀A)⊃
↓π⊃β%¬π)$4∀@@@∪∪≥ε%ππ≥($∩w∪≥
%≠9(Aπ⊃¬%βπ)∃$Aπ∨U≥(~∀%≠∨,∪H`XZQM R∩w∃π⊃≡AQ⊃
Aπ!β%βπQ$~∀%≠∨,∪HbY$`4∀∪∃'H∪!εYQ3!π⊃H~∀∪≠=,∩Q'@RVY$@~∀∪¬H@∪∪≤H∩∩wπ=≥)∪≥U
A%¬	∪≥∞4∀dHt@∪π%1∩∩∩m∪A∪PA∪&A∧Aπ$X↓)3!
↓αAπ$↓β≥λA1~∀∪5∨-∧∪HbXQ$@RV∩wA+(Aα↓π$A∪8A)⊃
↓')%∪9∞~∀∪5∨-∧@@@F`0Q$`R$∩w!+PA∪≤A∧A≥+→0Aπ⊃βIβπ)H~∀∪%Q&∪!ε$∩w%Q+%≤~)ππ≥(h∩`~∃⊃¬&t∩9¬3)
$b`Xh@Xb`X@~∀~∀m'sgi∃ZAYS9JAEk→MKef4∀~∃∪9¬+t$]¬→↔\∩hd\4∃∨+)	+t∩9¬→↔.$hd\~)π+%∪8t∪∪≥	+∩∩mπkee∃]hAY%]JAa=S]iKH~∀